/* global WIKI */

module.exports = {
  activate() {
    // not used
  },
  deactivate() {
    // not used
  },
  /**
   * INIT
   */
  init() {
    // not used
  },
  /**
   * QUERY
   *
   * @param {String} q Query
   * @param {Object} opts Additional options
   */
  async query(q, opts) {
    if (q.length > 10) {
      q = q.substr(0, 10)
    }
    // todo 加搜索缓存
    try {
      const results = await WIKI.models.pages.query()
        .column('pages.id', 'title', 'description', 'path', 'localeCode as locale')
        .withGraphJoined('tags') // Adding page tags since they can be used to check resource access permissions
        .modifyGraph('tags', builder => {
          builder.select('tag')
        })
        .where(builder => {
          builder.where('isPublished', true)
          if (opts.locale) {
            builder.andWhere('localeCode', opts.locale)
          }
          if (opts.path) {
            builder.andWhere('path', 'like', `${opts.path}%`)
          }
          builder.andWhere(builderSub => {
            if (WIKI.config.db.type === 'postgres') {
              builderSub.where('title', 'ILIKE', `%${q}%`)
              builderSub.orWhere('description', 'ILIKE', `%${q}%`)
              builderSub.orWhere('path', 'ILIKE', `%${q.toLowerCase()}%`)
            } else {
              builderSub.whereRaw(`Match(title,description,content) Against(?)`, [q])
            }
          })
        })
        .limit(WIKI.config.search.maxHits)
      return {
        results,
        suggestions: [],
        totalHits: results.length
      }
    } catch (e) {
      console.log(e)
    }
  },
  /**
   * CREATE
   *
   * @param {Object} page Page to create
   */
  async created(page) {
    // not used
  },
  /**
   * UPDATE
   *
   * @param {Object} page Page to update
   */
  async updated(page) {
    // not used
  },
  /**
   * DELETE
   *
   * @param {Object} page Page to delete
   */
  async deleted(page) {
    // not used
  },
  /**
   * RENAME
   *
   * @param {Object} page Page to rename
   */
  async renamed(page) {
    // not used
  },
  /**
   * REBUILD INDEX
   */
  async rebuild() {
    // not used
  }
}
